package com.hbnu.controller;

import com.hbnu.domain.User;
import com.hbnu.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;

/**
 * @version: 1.0
 * @ClassName: Login
 * @Description: TODO
 * @Author: 86132
 * @Date: 2025/11/5 9:00
 */
@Component
public class Register {
    private static final Pattern USERNAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_]{4,20}$");
    private static final Pattern PASSWORD_PATTERN = Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d@$!%*?&]{8,}$");
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");

    //注册
    public boolean register(User user) {
        //获取用户基本信息
        Scanner sc = new Scanner(System.in);
        // 获取并校验用户名
        String username = getValidatedUsername(sc);
        user.setUsername(username);
        // 获取并校验密码
        String password = getValidatedPassword(sc);
        user.setPassword(password);
        // 获取并校验手机号
        String phone = getValidatedPhone(sc);
        user.setPhone(phone);

        // 新增用户数据
        try {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService = (UserService) applicationContext.getBean("userService");
            userService.insert(user);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 获取并校验手机号
    private String getValidatedPhone(Scanner sc) {
        while (true) {
            System.out.print("请输入手机号（11位中国大陆手机号）：");
            String phone = sc.nextLine().trim();
            // 检查是否为空
            if (phone.isEmpty()) {
                System.out.println("手机号不能为空！");
                continue;
            }
            // 检查格式
            if (!PHONE_PATTERN.matcher(phone).matches()) {
                System.out.println("手机号格式不正确！");
                continue;
            }
            return phone;
        }
    }

    // 获取并校验密码
    private String getValidatedPassword(Scanner sc) {
        while (true) {
            System.out.print("请输入密码（至少8位，包含大小写字母和数字）：");
            String password = sc.nextLine().trim();
            // 检查是否为空
            if (password.isEmpty()) {
                System.out.println("密码不能为空！");
                continue;
            }
            // 检查长度
            if (password.length() < 8) {
                System.out.println("密码长度至少8位！");
                continue;
            }
            // 检查复杂度
            if (!PASSWORD_PATTERN.matcher(password).matches()) {
                System.out.println("密码必须包含大小写字母和数字！");
                continue;
            }
            // 确认密码
            System.out.print("请再次输入密码：");
            String confirmPassword = sc.nextLine().trim();
            if (!password.equals(confirmPassword)) {
                System.out.println("两次输入的密码不一致！");
                continue;
            }
            return password;
        }
    }

    // 获取并校验用户名
    private String getValidatedUsername(Scanner sc) {
        while (true) {
            System.out.print("请输入用户名（4-20位字母、数字或下划线）：");
            String username = sc.nextLine().trim();
            // 检查是否为空
            if (username.isEmpty()) {
                System.out.println("用户名不能为空！");
                continue;
            }
            // 检查长度
            if (username.length() < 4 || username.length() > 20) {
                System.out.println("用户名长度必须在4-20个字符之间！");
                continue;
            }
            // 检查格式
            if (!USERNAME_PATTERN.matcher(username).matches()) {
                System.out.println("用户名只能包含字母、数字和下划线！");
                continue;
            }
            return username;
        }
    }
}
